/**
 * Android XML 格式生成器
 * 生成 strings.xml 文件
 */
class XmlGenerator {
  static async generate(data, platform = "android") {
    if (!data || typeof data !== "object") {
      throw new Error("数据必须是一个对象");
    }

    let result = "";

    // XML 头部
    result += this.generateHeader();

    // 开始 resources 标签
    result += "<resources>\n";

    // 对键进行排序
    const sortedKeys = Object.keys(data).sort();

    for (const key of sortedKeys) {
      const value = data[key];

      // 转义特殊字符
      const escapedValue = this.escapeValue(value);

      // 生成 string 标签
      result += `    <string name="${this.escapeAttributeValue(
        key
      )}">${escapedValue}</string>\n`;
    }

    // 结束 resources 标签
    result += "</resources>\n";

    return result;
  }

  static generateHeader() {
    const now = new Date().toISOString();
    return `<?xml version="1.0" encoding="utf-8"?>
<!--
    Generated by i18n-CLI
    Created on ${now}
-->
`;
  }

  static escapeValue(value) {
    if (typeof value !== "string") {
      return String(value);
    }

    return value
      .replace(/&/g, "&amp;") // 必须最先替换
      .replace(/</g, "&lt;") // 小于号
      .replace(/>/g, "&gt;") // 大于号
      .replace(/"/g, '\\"') // 双引号
      .replace(/'/g, "\\'") // 单引号
      .replace(/\n/g, "\\n") // 换行符
      .replace(/\t/g, "\\t") // 制表符
      .replace(/\r/g, "\\r") // 回车符
      .replace(/@/g, "\\@") // @ 符号
      .replace(/\?/g, "\\?"); // ? 符号
  }

  static escapeAttributeValue(value) {
    if (typeof value !== "string") {
      return String(value);
    }

    return value
      .replace(/&/g, "&amp;")
      .replace(/</g, "&lt;")
      .replace(/>/g, "&gt;")
      .replace(/"/g, "&quot;")
      .replace(/'/g, "&#39;");
  }

  static generateStringArray(data, arrayName = "string_array") {
    // 生成字符串数组格式
    let result = `    <string-array name="${arrayName}">\n`;

    const sortedKeys = Object.keys(data).sort();

    for (const key of sortedKeys) {
      const value = data[key];
      const escapedValue = this.escapeValue(value);
      result += `        <item>${escapedValue}</item>\n`;
    }

    result += `    </string-array>\n`;

    return result;
  }

  static generatePlurals(data, platform = "android") {
    // 生成复数形式格式
    let result = "";

    const sortedKeys = Object.keys(data).sort();

    for (const key of sortedKeys) {
      const value = data[key];
      const escapedValue = this.escapeValue(value);

      result += `    <plurals name="${this.escapeAttributeValue(key)}">\n`;
      result += `        <item quantity="one">${escapedValue}</item>\n`;
      result += `        <item quantity="other">${escapedValue}</item>\n`;
      result += `    </plurals>\n`;
    }

    return result;
  }
}

module.exports = XmlGenerator;
